{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch\n",
    "import sys\n",
    "from torch import nn\n",
    "import torch.nn.functional as F\n",
    "sys.path.append(\"../\")\n",
    "from mymodel import utils\n",
    "from mymodel import Show\n",
    "import pickle\n",
    "import re"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "35996"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# vocab\n",
    "with open(\"../data/timemachine.txt\",'r',encoding=\"utf-8\") as f:\n",
    "    lines = f.readlines()\n",
    "content = [re.sub(\"[^A-Za-z]+\",\" \",line).strip().lower() for line in lines] # 将不是A-Za-z中的一个或多个字符替换为空格\n",
    "tokens = utils.tokenize(content,\"word\") # tokens还是分行2d的\n",
    "\n",
    "vocab = utils.Vocab(tokens) # 词库索引转token，token转索引\n",
    "corpus = [vocab[token] for line in tokens for token in line] # 数字表示的文本\n",
    "len(corpus)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "# iter\n",
    "batch_size, num_steps = 32, 35\n",
    "device = utils.trygpu(0)\n",
    "class data_iter:\n",
    "    def __init__(self, corpus, use_random_iter=False) -> None:\n",
    "        self.random = use_random_iter\n",
    "        self.corpus = corpus\n",
    "    def __iter__(self):\n",
    "        if self.random:\n",
    "            return utils.seq_data_iter_random(self.corpus, batch_size, num_steps)\n",
    "        else:\n",
    "            return utils.seq_data_iter_seq(self.corpus, batch_size, num_steps)\n",
    "train_iter = data_iter(corpus)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "num_hidden = 256\n",
    "rnn_layer = nn.LSTM(len(vocab), num_hidden)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "from mymodel.utils import RNNModel\n",
    "net = RNNModel(rnn_layer, len(vocab)).to(device)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "困惑度 1.7 device: cuda:0\n",
      "time traveller  younottoldyouyoustandingyoucan  itsnotstandingthattimeinthecourse  thepsychologistandfilbyameregettingwasall andholdingitwasakindkindyoushowedmanhis headtowardsthetimetravellerthe\n",
      "[trainRNN] run time :195.07714748382568 seconds\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 450x350 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "utils.trainRNN(10, net, train_iter, vocab, lr = 1, epochs=500, device=device, word=True)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "python3.7.2",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
